package ihm;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;
import modelesObjet.ModeleFondCarte;
import modelesObjet.ModeleListePluviometres;
import modelesObjet.ModelePluviometre;
import modelesObjet.ModelePointFond;
import visualisationRadar.VisualisationRadar;

public class PanneauAppli extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3520380895703007535L;
	private VisualisationRadar visualisationRadar;
	private boolean fond=false;
	private boolean pointRadar=false;
	private boolean isPluvios=false;
	
	private Image image;
	private Image mire;
	private int[] tableauImage;
	private int[] tableauMire;
	private int cote;
	private String chaineErreur;
	private String[] lignes;
	
	public PanneauAppli(VisualisationRadar visualisationRadar,int largeur,int hauteur){
		super();
		this.visualisationRadar=visualisationRadar;

		setPreferredSize(new Dimension(largeur,hauteur));	
		setBackground(Color.WHITE);
	}

	@Override
	public void paintComponent(Graphics g)
	{		
		super.paintComponent(g);
		//System.out.println(radar.hasImage());

		try{

			tableauImage=visualisationRadar.getObjetRadar().getImageRadar().getPixels().getTableauPixels();
			tableauMire=visualisationRadar.getObjetRadar().getImageRadar().getMire().getTableauMire();
			cote=(int)Math.sqrt(tableauMire.length/16);
//			
			mire = createImage (new MemoryImageSource
					(16*cote, cote,tableauMire,0,16*cote));
			image = createImage (new MemoryImageSource
					(VisualisationRadar.NBPIXELS, VisualisationRadar.NBPIXELS,tableauImage, 0, VisualisationRadar.NBPIXELS));
//
			g.drawImage (image, 0, 0, null);
//			/*la mire*/
			g.drawImage (mire, 15, 522, null);
			g.drawRect (15,522,16*cote,cote);
			if(fond){
				if (visualisationRadar.getObjetRadar().getImageRadar().getFondCarte()==null){
					fond=false;
					chaineErreur=("Fichier  absent");				
					JOptionPane.showMessageDialog(this,chaineErreur);
				}else{
					afficherFond(g);
				}
			}
			if(isPluvios){
//TODO
//				if (radar.getObjetRadar().getImageRadar().getListePluvios()==null){
//					isPluvios=false;
//					String chaineErreur=("Fichier  absent");				
//					JOptionPane.showMessageDialog(this,chaineErreur);
//				}else{
					afficherPluvios(g);
//				}
			}
			if (visualisationRadar.getChoixZoom())
				g.drawRect(visualisationRadar.getZoomX()-FenetreZoom.tailleZoom/2,
						visualisationRadar.getZoomY()-FenetreZoom.tailleZoom/2,FenetreZoom.tailleZoom,FenetreZoom.tailleZoom);

			String[] etiquette=visualisationRadar.getObjetRadar().getImageRadar().getMire().getLibelleEchelle();
			g.setColor(Color.black);

			Font maFontmire=new Font("Arial", Font.PLAIN, 10) ;
			g.setFont(maFontmire);
			for(int i=0;i<16;i++)
			{
				g.drawLine (15+(30*i),522,15+(30*i),555);
				g.drawString(etiquette[i],30+(30*i),576);
			}
			g.drawString(visualisationRadar.getObjetRadar().getImageRadar().getEchelle().getUnite(),10,595);
			/*le titre de l image (radar+date)*/
			Font maFont=new Font("ARIAL", Font.BOLD, 18) ;
			g.setFont(maFont);
			//g.drawString("aa");
			//g.drawString(radar.getObjetRadar().getImageRadar().getNomRadar()+", ",20,630);
			lignes=visualisationRadar.getObjetRadar().getImageRadar().getChaine().split("\n");
			for (int i=0;i<lignes.length;i++)
				g.drawString(lignes[i],20,630+20*i);

			g.drawRect(0, 0,511,511);		
			/*la croix du radar*/
			g.setColor(Color.black);
			if(pointRadar)
			{
				g.drawLine(255, 252,255,258);
				g.drawLine(252, 255,258,255);
			}	
		}catch(Exception e){
			Font maFont=new Font("Dialog", Font.PLAIN, 30) ;
			g.setFont(maFont);
			g.drawString("PAS D'IMAGE ",100,200);
			g.drawString("A AFFICHER ",100,250);
		}
	}

	//--affichage du fond
	public void afficherFond(Graphics g) 
	{
		/* dessine le fond de carte*/
		ModelePointFond p1,p2;
		ModeleFondCarte carte = visualisationRadar.getObjetRadar().getImageRadar().getFondCarte();
		int  nblignes=carte.getPoints().size();
		int i1,i2,j1,j2;
		p1=carte.getPoints().get(0);

		for (int k=1;k<nblignes-2;k++)
		{ 
			p2=carte.getPoints().get(k);
			i1=p1.getX();
			i2=p2.getX();
			j1=p1.getY();
			j2=p2.getY();

			if (i1>=0 && i1 <VisualisationRadar.NBPIXELS && j1>=0 && j1<VisualisationRadar.NBPIXELS &&i2>=0
					&& i2 <VisualisationRadar.NBPIXELS && j2>=0 && j2<VisualisationRadar.NBPIXELS){
				if (p2.getCouleur()==p1.getCouleur() ) 
				{
					if(  p2.getCouleur()==1)
						g.setColor(Color.BLUE );
					else
						if (  p2.getCouleur()==7 || p2.getCouleur()==9)
							g.setColor(Color.CYAN);
						else
							if (  p2.getCouleur()==5 )
								g.setColor(Color.RED);
							else
								if (  p2.getCouleur()==3 )
									g.setColor(Color.BLACK);
					g.drawLine(i1,j1,i2,j2); 
				}
			}
			p1=carte.getPoints().get(k);
		}  
	}

	//--affichage des pluvios
	public void afficherPluvios(Graphics g) 
	{
		/* dessine le fond de carte*/
		ModelePluviometre p1;
		ModeleListePluviometres listePluvios = visualisationRadar.getObjetRadar().getImageRadar().getPluviometres();
		Vector<? extends ModelePluviometre> vecteurPluvios = listePluvios.getVecteurPluviometres();
		int  nblignes=vecteurPluvios.size();
		int i1,j1;
		p1=vecteurPluvios.get(0);

		for (int k=1;k<nblignes-2;k++)
		{ 
			i1=p1.getRadarX();
			j1=p1.getRadarY();
			if (i1>=0 && i1 <VisualisationRadar.NBPIXELS && j1>=0 && j1<VisualisationRadar.NBPIXELS){
				g.setColor(Color.BLACK);
				g.drawRect(i1, j1, 2, 2); 
			}
			p1=vecteurPluvios.get(k);
		}  
	}
	
	//--sauvegarde de l image en .jpeg
	public void saveGraphics(String nomJpeg){
		/*sauver l image en .jpeg*/
		File rep= new File(VisualisationRadar.repertoireImages);
		if(rep.exists()==false) rep.mkdir();
		File f = new File(rep.getAbsolutePath(), nomJpeg+".jpeg");
		BufferedImage bi =(BufferedImage)createImage(VisualisationRadar.NBPIXELS,700);
		Graphics g = bi.getGraphics();
		paint(g); 
		g.dispose();
		Cursor curseur=new Cursor(Cursor.WAIT_CURSOR);
		setCursor(curseur);
		try 
		{
			ImageIO.write(bi,"jpeg",f); 
			String chaineErreur=("fichier sauvegarde : "
					+VisualisationRadar.repertoireImages+nomJpeg+".jpeg ");			
			//System.out.println("BEEP!");
			java.awt.Toolkit.getDefaultToolkit().beep();
			System.out.flush();
			JOptionPane.showMessageDialog(this,chaineErreur);
		}
		catch (IOException e)
		{
			String chaineErreur=("Ecriture du fichier "
					+VisualisationRadar.repertoireImages+nomJpeg+".jpeg impossible");			
			curseur=new Cursor(Cursor.DEFAULT_CURSOR);
			setCursor(curseur);
			//System.out.println("BEEP\u0007!");
			java.awt.Toolkit.getDefaultToolkit().beep();
			System.out.flush();
			JOptionPane.showMessageDialog(this,chaineErreur);
		}
		curseur=new Cursor(Cursor.DEFAULT_CURSOR);
		setCursor(curseur);		
	}

	public boolean getFond() {
		return fond;
	}
	public boolean getPointRadar() {
		return pointRadar;
	}
	public void setFond(boolean fond) {
		this.fond = fond;
	}
	public void setPointRadar(boolean pointRadar) {
		this.pointRadar = pointRadar;
	}
	public boolean isPluvios() {
		return isPluvios;
	}

	public void setPluvios(boolean isPluvios) {
		this.isPluvios = isPluvios;
	}
}
